package view;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileInputStream;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

import model.CiiBay;


/**
 * Deze klasse behandelt het registreren van een nieuwe gebruiker.
 * @author Jaap
 * @version 1
 */
@SuppressWarnings("serial")
public class RegistreerView extends JPanel{
	private JLabel naam, wachtwoord;
	private JButton reset, registreer;
	private JTextField naamVeld;
	private JPasswordField wachtwoordVeld;
	private CiiBay ciiBay;
	private Image image;
	
	/**
	 * Constructor. Maakt de invoervelden en labels aan en plaatst ze in een GridBagLayout.
	 * @author Jaap
	 * @param ciiBay - Het model
	 * 
	 */
	public RegistreerView(CiiBay ciiBay){
		naam = new JLabel("Gebruikersnaam:   ");
		wachtwoord = new JLabel("Wachtwoord:");
		reset = new JButton("Reset");
		registreer = new JButton("Registreren");
		naamVeld = new JTextField();
		naamVeld.setDocument(new MaxAantalKarakters(25));
		naamVeld.setSize(100, 20);
		wachtwoordVeld = new JPasswordField();
		wachtwoordVeld.setDocument(new MaxAantalKarakters(25));
		this.ciiBay = ciiBay;
		
		image = getFileImage("./files/registratie.jpg");
		
		repaint();
		setLayout(new GridBagLayout());
		GridBagConstraints c = new GridBagConstraints();
		c.fill = GridBagConstraints.NONE;
		c.gridx = 0;
		c.gridy = 5;
		add(naam, c);
		c.fill = GridBagConstraints.HORIZONTAL;
		c.gridx = 1;
		add(naamVeld, c);
		c.gridx = 0;
		c.gridy = 6;
		add(wachtwoord, c);
		c.gridx = 1;
		add(wachtwoordVeld, c);
		c.gridx = 0;
		c.gridy = 7;
		add(reset, c);
		c.gridx = 1;
		add(registreer, c);
		
		setBackground(Color.ORANGE);
		reset.setBackground(Color.ORANGE);
		registreer.setBackground(Color.ORANGE);
		
		reset.addActionListener(new ResetKnopHandler());
		registreer.addActionListener(new RegistreerKnopHandler());
	}
	
	private Image getFileImage(String filePath) {
		try {
	        FileInputStream in = new FileInputStream(filePath);
	        byte[] b           = new byte[in.available()];

	        in.read(b);
	        in.close();

	        return Toolkit.getDefaultToolkit().createImage(b);
	    } catch (Exception ex) {}
	    return null;
	}
	
	public void paintComponent(Graphics g) {
        super.paintComponent(g);

        if (image != null) {
        	g.drawImage(image, 0, 0, this);
        }
	}

	class ResetKnopHandler implements ActionListener{
		/**
		 * Event handler voor de resetknop
		 * @author Jaap
		 */
		public void actionPerformed(ActionEvent arg0) {
			naamVeld.setText("");
			wachtwoordVeld.setText("");		
		}
	}
	
	class RegistreerKnopHandler implements ActionListener{
		/**
		 * Event handler voor de registreerknop. Controleert of de velden wel zijn ingevoerd en geeft waar nodig een foutmelding.
		 * @author Jaap
		 * @since v1
		 */
		public void actionPerformed(ActionEvent e) {
			String gebruikersnaam = naamVeld.getText();
			char[] wwoord = wachtwoordVeld.getPassword();
			StringBuffer ww = new StringBuffer();
			for(char c : wwoord){
				ww.append(c);
			}
			String wachtwoord = ww.toString();

			Pattern isGoed = Pattern.compile("\\w*[_.-]*");

			Matcher m1 = isGoed.matcher(gebruikersnaam);
			Matcher m2 = isGoed.matcher(wachtwoord);
			if(!m1.matches() || gebruikersnaam.equals("")){
				JOptionPane.showMessageDialog(null, "Voer een geldige gebruikersnaam in!", "Fout!", JOptionPane.ERROR_MESSAGE);
			}else if(!m2.matches() || wachtwoord.equals("")){
				JOptionPane.showMessageDialog(null, "Voer een geldig wachtwoord in!", "Fout!", JOptionPane.ERROR_MESSAGE);
			}else{
				String registreer = ciiBay.registreerGebruiker(gebruikersnaam, wachtwoord);
				if(registreer.equals("Gebruikersnaam bestaat al")){
					JOptionPane.showMessageDialog(null, "Gebruikersnaam bestaat al.\nProbeer een andere naam.", "Fout!", JOptionPane.ERROR_MESSAGE);
				}else{
					JOptionPane.showMessageDialog(null, registreer, "Melding", JOptionPane.INFORMATION_MESSAGE);
					naamVeld.setText("");
					wachtwoordVeld.setText("");
					ciiBay.veranderView("uitloggen");
				}
			}
		}
	}
}
